<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="QhH08" id="QhH08"><span data-lake-id="u40a75a11" id="u40a75a11">典型回答</span></h1>
  <p data-lake-id="ua40d7153" id="ua40d7153"><br></p>
  <p data-lake-id="uffa161d9" id="uffa161d9"><span data-lake-id="u5b364ffa" id="u5b364ffa">最终的返回值将会是C！</span></p>
  <p data-lake-id="u5a755822" id="u5a755822"><span data-lake-id="u9a8f53a6" id="u9a8f53a6">​</span><br></p>
  <p data-lake-id="u38993967" id="u38993967"><span data-lake-id="ub1568402" id="ub1568402">因为finally块总是在try和catch块之后执行，无论是否有异常发生。如果finally块中有一个return语句，它将覆盖try块和catch块中的任何return语句。</span></p>
  <p data-lake-id="u777be16e" id="u777be16e"><span data-lake-id="u1b9dd5ef" id="u1b9dd5ef">​</span><br></p>
  <pre lang="java"><code>
//无异常情况
public static String getValue(){
    try{
        return "A";
    }catch (Exception e){
        return "B";
    }finally {
        return "C";
    }
}

//有异常情况
public static String getValue(){
    try{
        System.out.println(1/0);
        return "A";
    }catch (Exception e){
        return "B";
    }finally {
        return "C";
    }
}
</code></pre>
  <p data-lake-id="u927d98c1" id="u927d98c1"><span data-lake-id="u2624d5db" id="u2624d5db">​</span><br></p>
  <p data-lake-id="ue5b1c127" id="ue5b1c127"><span data-lake-id="uaaacde07" id="uaaacde07">所以在这种情况下，无论try和catch块的执行情况如何，finally块中的return C;总是最后执行的语句，并且其返回值将是整个代码块的返回值。</span></p>
  <p data-lake-id="ufb047dfb" id="ufb047dfb"><span data-lake-id="u551c45c7" id="u551c45c7">​</span><br></p>
  <p data-lake-id="ud7bb0d6d" id="ud7bb0d6d"><span data-lake-id="u001437b6" id="u001437b6">这个问题还有一个兄弟问题，那就是如下代码得到的结果是什么：</span></p>
  <p data-lake-id="ub7581169" id="ub7581169"><span data-lake-id="ua8ff6469" id="ua8ff6469">​</span><br></p>
  <pre lang="java"><code>
public static void getValue() {

    int i = 0;

    try {
        i = 1;
    } catch (Exception e) {
        i = 2;
    } finally {
        i = 3;
    }
    System.out.println(i);
}
</code></pre>
  <p data-lake-id="u1654a777" id="u1654a777"><span data-lake-id="ub25633a0" id="ub25633a0">​</span><br></p>
  <p data-lake-id="u34b578af" id="u34b578af"><span data-lake-id="uee79dcde" id="uee79dcde">原理和上面的是一样的，最终输出内容为3。</span></p>
  <p data-lake-id="u027bc725" id="u027bc725"><span data-lake-id="uccb87c7b" id="uccb87c7b">​</span><br></p>
  <h1 data-lake-id="iDbX3" id="iDbX3"><span data-lake-id="ua381721d" id="ua381721d">扩展知识</span></h1>
  <p data-lake-id="u3d91f431" id="u3d91f431"><br></p>
  <h2 data-lake-id="YpscU" id="YpscU"><span data-lake-id="u92457dee" id="u92457dee">finally和return的关系</span></h2>
  <p data-lake-id="ufd3ed7aa" id="ufd3ed7aa"><br></p>
  <p data-lake-id="u6ff5c3da" id="u6ff5c3da"><span data-lake-id="u3101f903" id="u3101f903">很多时候，我们的一个方法会通过return返回一个值，那么如以下代码：</span></p>
  <p data-lake-id="u38abf7cc" id="u38abf7cc"><span data-lake-id="u214eee9b" id="u214eee9b">​</span><br></p>
  <pre lang="java"><code>
public static int getValue() {

    int i = 1;

    try {
         i++;
         return i;
    } catch (Exception e) {
        i = 66;
    } finally {
        i = 100;
    }

    return i;
}
</code></pre>
  <p data-lake-id="u77c52ec8" id="u77c52ec8"><br></p>
  <p data-lake-id="ube8b9a1f" id="ube8b9a1f"><span data-lake-id="u2aaaeeda" id="u2aaaeeda">这个代码得到的结果是2，try-catch-finally的执行顺序是try-&gt;finally或者try-catch-finally，然后在执行每一个代码块的过程中，如果遇到return那么就会把当前的结果暂存，然后再执行后面的代码块，然后再把之前暂存的结果返回回去。</span></p>
  <p data-lake-id="u2ff25b45" id="u2ff25b45"><span data-lake-id="u5abf2af0" id="u5abf2af0">​</span><br></p>
  <p data-lake-id="ueaece698" id="ueaece698"><span data-lake-id="u19b7c0c6" id="u19b7c0c6">所以以上代码，会先把i++即2的结果暂存，然后执行i=100，接着再把2返回。</span></p>
  <p data-lake-id="u6a5edeb8" id="u6a5edeb8"><span data-lake-id="u010ec623" id="u010ec623">​</span><br></p>
  <p data-lake-id="ue3aa1314" id="ue3aa1314"><span data-lake-id="u9bf470c5" id="u9bf470c5">但是，在执行后续的代码块过程中，如果遇到了新的return，那么之前的暂存结果就会被覆盖。如：</span></p>
  <p data-lake-id="uce730a9e" id="uce730a9e"><span data-lake-id="u06d86696" id="u06d86696">​</span><br></p>
  <pre lang="java"><code>
public static int getValue() {

    int i = 1;

    try {
         i++;
         return i;
    } catch (Exception e) {
        i = 66;
    } finally {
        i = 100;
        return i;
    }
}
</code></pre>
  <p data-lake-id="ue50996ea" id="ue50996ea"><br></p>
  <p data-lake-id="u0968b21d" id="u0968b21d"><span data-lake-id="u76731362" id="u76731362">以上代码方法得到的结果是100，是因为在finally中遇到了一个新的return，就会把之前的结果给覆盖掉。</span></p>
  <p data-lake-id="uc03770bf" id="uc03770bf"><span data-lake-id="u9b99076f" id="u9b99076f">​</span><br></p>
  <p data-lake-id="uf65efe50" id="uf65efe50"><span data-lake-id="uad23c89f" id="uad23c89f">如果代码出现异常也同理：</span></p>
  <p data-lake-id="u83583457" id="u83583457"><span data-lake-id="u7beb845c" id="u7beb845c">​</span><br></p>
  <pre lang="java"><code>
public static int getValue() {

    int i = 1;

    try {
        i++;
        System.out.println(1 / 0);
        return i;
    } catch (Exception e) {
        i = 66;
        return i;
    } finally {
        i = 100;
        return i;
    }
}
</code></pre>
  <p data-lake-id="u1ab5edd4" id="u1ab5edd4"><span data-lake-id="uca9df1a6" id="uca9df1a6">​</span><br></p>
  <p data-lake-id="u6c75962d" id="u6c75962d"><span data-lake-id="u6f30f094" id="u6f30f094">在try中出现一个异常之后，会执行catch，在执行finally，最终得到100。如果没有finally：</span></p>
  <p data-lake-id="u887a3cf5" id="u887a3cf5"><span data-lake-id="u6af423b4" id="u6af423b4">​</span><br></p>
  <pre lang="java"><code>
public static int getValue() {

    int i = 1;

    try {
        i++;
        System.out.println(1 / 0);
        return i;
    } catch (Exception e) {
        i = 66;
        return i;
    } 
}
</code></pre>
  <p data-lake-id="u6f2e21c3" id="u6f2e21c3"><span data-lake-id="u648f51ce" id="u648f51ce">​</span><br></p>
  <p data-lake-id="uf9ca6617" id="uf9ca6617"><span data-lake-id="u7a60d703" id="u7a60d703">那么得到的结果将是66。</span></p>
  <p data-lake-id="u9a7a8878" id="u9a7a8878"><span data-lake-id="u703b4746" id="u703b4746">​</span><br></p>
  <p data-lake-id="ua56f256f" id="ua56f256f"><strong><span data-lake-id="uc069762b" id="uc069762b">所以，如果finally块中有return语句，则其返回值将是整个try-catch-finally结构的返回值。如果finally块中没有return语句，则try或catch块中的return语句（取决于哪个执行了）将确定最终的返回值。</span></strong></p>
  <p data-lake-id="u7770c47e" id="u7770c47e"><span data-lake-id="u7b03782c" id="u7b03782c"><br><br></span></p>
 </body>
</html>